#ifdef _WIN32
#include <stdio.h>
#include <iostream>
#else
#include <android/log.h>
#endif

#define IMAGE_DEPTH_IO_ERROR 0x1
#define IMAGE_DEPTH_LOGIC_ERROR 0x2
#define IMAGE_DEPTH_UNIMPL_ERROR 0x3

#define IMAGE_DEPTH_LOG_TAG "IMAGE_DEPTH"

#define PERFORMANCE_ANALYSIS 1
#if PERFORMANCE_ANALYSIS == 1
#define TICK() cv::getTickCount()
#ifdef _WIN32
#define IMAGE_DEPTH_LOGI(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " I: " fmt "\n", __VA_ARGS__)
#define IMAGE_DEPTH_LOGW(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " W: " fmt "\n", __VA_ARGS__)
#define IMAGE_DEPTH_LOGE(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " E: " fmt "\n", __VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ fprintf(stdout, IMAGE_DEPTH_LOG_TAG " A: " fmt "\n", __VA_ARGS__); exit(-1); } }
#define FAIL_EXIT(code) {fprintf(stdout, "Exit at %s:%d", __FILE__, __LINE__);system("pause"); exit(code);}
#else
#define IMAGE_DEPTH_LOGI(...) __android_log_print(ANDROID_LOG_INFO, IMAGE_DEPTH_LOG_TAG, __VA_ARGS__)
#define IMAGE_DEPTH_LOGW(...) __android_log_print(ANDROID_LOG_WARN, IMAGE_DEPTH_LOG_TAG, __VA_ARGS__)
#define IMAGE_DEPTH_LOGE(...) __android_log_print(ANDROID_LOG_ERROR, IMAGE_DEPTH_LOG_TAG, __VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ __android_log_assert(#cond, IMAGE_DEPTH_LOG_TAG, fmt, ##__VA_ARGS__);}}
#define FAIL_EXIT(code) {exit(code);}
#endif
#else
#define TICK() 0
#ifdef _WIN32
#define IMAGE_DEPTH_LOGI(fmt, ...)
#define IMAGE_DEPTH_LOGW(fmt, ...)
#define IMAGE_DEPTH_LOGE(fmt, ...) fprintf(stdout, IMAGE_DEPTH_LOG_TAG " E: " fmt "\n", __VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ fprintf(stdout, IMAGE_DEPTH_LOG_TAG " A: " fmt "\n", __VA_ARGS__); exit(-1); } }
#define FAIL_EXIT(code) {system("pause"); exit(code);}
#else
#define IMAGE_DEPTH_LOGI(...)
#define IMAGE_DEPTH_LOGW(...)
#define IMAGE_DEPTH_LOGE(...) __android_log_print(ANDROID_LOG_ERROR, IMAGE_DEPTH_LOG_TAG, __VA_ARGS__)
#define ASSERT(cond, fmt, ...) { if(!(cond)){ __android_log_assert(#cond, IMAGE_DEPTH_LOG_TAG, fmt, ##__VA_ARGS__);}}
#define FAIL_EXIT(code) {exit(code);}
#endif
#endif
